package noframework.atguigu.servlet;

import com.alibaba.druid.util.StringUtils;
import noframework.atguigu.utils.JDBCUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;

/**
 * projectName: javaweb
 *
 * @author: 赵伟风
 * time: 2022/7/1 16:59 周五
 * description: 处理登录逻辑的动态资源，成功  index.html 失败 index.html
 *
 *   TODO:
 *     1. 设置编码格式 [request,response]
 *     2. 通过请求参数获取账号和密码
 *     3. 根据账号和密码进行数据库查询 [DBUtils]  count 账号和密码存在的用户数量
 *     4. 判断结果，确定登录是否成功 count == 0 账号或者密码错误！  = 1  查询到用户，登录成功！
 *     5. 使用资源跳转  index.html / index.html
 *
 *
 *  TODO:  servlet通用步骤
 *     1.设置编码格式  【防止乱码】
 *     2.获取请求参数  【获取前端传递的数据，完成业务的支撑】
 *     3.参数的校验    【对参数进行校验和处理，避免没必要的数据库curd,参数符合数据库的需求 例如： 非空判断 或者 密码的加密处理】
 *     4.数据库的curd  【数据库的操作 jdbc CURD】
 *     5.数据库结果处理【处理数据库curd的结果，符合前端索要的需求】
 *     6.响应前端数据  【给前端反馈数据： 直接返回：字符和字节  资源跳转： 转发和重定向】
 *
 */
//@WebServlet("/user/login")
public class UserLoginServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //1.设置编码格式
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        //2.获取请求参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        //3.参数校验和处理
        if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)){
            //非空判断
            //账号或者密码为null，直接返回登录页面！
            resp.sendRedirect(req.getContextPath()+"/index.html");
            return ;
        }

        //4.数据库的curd
        String sql = "select count(1) ct from user where u_account = ? and u_password = ? ; ";

        QueryRunner queryRunner = new QueryRunner(JDBCUtil.getDataSource());
        Long count = 0L;
        try {
            count = (Long) queryRunner.query(sql, new ScalarHandler(), username, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }

        //5.数据库结果处理
        boolean flag = false; //false是登录失败
        if (count > 0){
            //登录成功
            flag = true;
        }

        //6.前端数据响应 【4选1  转发  重定向】
        if (flag){
            //登录成功
            req.getRequestDispatcher("/index.html")
                    .forward(req,resp);
        }else{
            //登录失败
            req.getRequestDispatcher("/index.html")
                    .forward(req,resp);
        }

    }

}
